package br.com.android.financas.model;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import br.com.android.financas.helper.FieldName;

import com.j256.ormlite.dao.ForeignCollection;
import com.j256.ormlite.field.DataType;
import com.j256.ormlite.field.DatabaseField;
import com.j256.ormlite.field.ForeignCollectionField;
import com.j256.ormlite.table.DatabaseTable;

@DatabaseTable
public class Despesa extends EntidadeAbstrata implements Apresentavel{

	private static final long serialVersionUID = 1073694295692104395L;

	public Despesa() {
	}


	@DatabaseField(generatedId = true)
	private Integer id;

	@DatabaseField(canBeNull=true,foreign=true,foreignAutoRefresh=true,foreignAutoCreate=true)
	private Despesa pai;

	@DatabaseField(canBeNull=true,foreign=true,foreignAutoRefresh=true,foreignAutoCreate=true)
	private Recorrente recorrente;

	@DatabaseField(canBeNull=false,columnName="categoria",foreign=true,foreignAutoRefresh=true)
	@FieldName(fieldName="campoCategoria")
	private Categoria categoria;

	@DatabaseField(canBeNull=false,dataType=DataType.DOUBLE)
	@FieldName(fieldName="campoValor")
	private double valor;

	@DatabaseField(canBeNull=true)
	@FieldName(fieldName="campoDescricao")
	private String descricao;

	@DatabaseField(canBeNull=false,dataType=DataType.DATE_LONG)
	@FieldName(fieldName="campoData")
	private Date data=new Date();

	@ForeignCollectionField(eager=false)
	private ForeignCollection<Despesa> filhos;

	public Serializable getId() {
		return id;
	}

	public Categoria getCategoria() {
		return categoria;
	}

	public void setCategoria(Categoria categoria) {
		this.categoria = categoria;
	}

	public double getValor() {
		return valor;
	}

	public void setValor(double valor) {
		this.valor = valor;
	}

	public String getDescricao() {
		return descricao;
	}

	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}

	public Date getData() {
		return data;
	}

	public void setData(Date data) {
		this.data = data;
	}

	@Override
	public int getCor() {
		return getCategoria().getCor();
	}

	public Despesa getPai() {
		return pai;
	}
	public void setPai(Despesa pai) {
		this.pai = pai;
	}

	public Recorrente getRecorrente() {
		return recorrente;
	}
	public void setRecorrente(Recorrente recorrente) {
		this.recorrente = recorrente;
	}

	public ForeignCollection<Despesa> getFilhos() {
		return filhos;
	}
	public void setFilhos(ForeignCollection<Despesa> filhos) {
		this.filhos = filhos;
	}

	public boolean isPai(){
		return pai==null && getFilhos().size()>0;
	}

	public Despesa getUltimoFilho(){
		List<Despesa> filhos;
		if(isPai())
			filhos= new ArrayList<Despesa>(getFilhos());
		else
			filhos= new ArrayList<Despesa>(getPai().getFilhos());

		return filhos.get(filhos.size()-1);
	}

	@Override
	public int compareTo(Apresentavel another) {
		if(getData().before(another.getData()))
			return -1;
		else
			if(getData().equals(another.getData()))
				return 0;
			else
				return 1;
	}

}
